<?php
/**
 * Created by PhpStorm.
 * User: chniccs
 * Date: 2019-11-06
 * Time: 10:49
 */

namespace app\http\middleware;

//记录浏览量
use app\constant\ActivesConst;
use app\model\AdminActives;
use think\Exception;
use think\facade\Cache;

class AppViews
{
    /**
     * 记录浏览量
     * @param \think\facade\Request $request
     * @param \Closure $next
     * @return mixed|\think\response\Json
     */
    public function handle($request, \Closure $next) {
        $id = $request->param('id');
        $views= Cache::get(ActivesConst::VIEWS_TAG . $id);
        //通过redis缓存计数，大概能提高20倍左右的性能，但也存在问题，如果在一周内浏览量没有大于100，那么最终缓存将过期
        //已经通过定时任务来每天定时的将redis中的缓存更新到数据库中
        if(isset($views)){
            //每100次浏览写一次数据库
            if($views>=100){
                try {
                    (new AdminActives())->where(['id' => $id])->setInc('views', $views);
                    //重新从1开始记录
                    Cache::set(ActivesConst::VIEWS_TAG . $id,1,ActivesConst::VIEWS_TAG_EXPIRE);
                } catch (Exception $e) {
                }
            }else{
                //记录加1
                Cache::inc(ActivesConst::VIEWS_TAG . $id);
            }
        }else{
            Cache::set(ActivesConst::VIEWS_TAG . $id,1);
        }
        return $next($request);
    }
}